package hottargui.domain;

/**
 * Responsibilitys:
 * 
 * a) Creates products acording to gamevariant
 * 
 * 
 *  
 */
public interface GameFactory {


	/**
	 * Creates a board for the game   
	 * @return a bord 
	 **/	
	Board createBoard();

	/**
	 * Creates the RolldiceStrategey used for this game
	 * @return a RollDiceStrategy
	 */
	RollDiceStrategy createRollDiceStrategy();


	/**
	 * Creates the rules by witch the game ends. This can be by counting rounds, or if a   
	 * winner is found accordingly rules for the game. Uses WinnerStrategy to determine winner og game
	 * @return the rules by witch the game ends
	 **/	
	EndRoundStrategy createEndRoundStrategy(StateMachine sm);


	/**
	 * Creates the rules by witch the winner of the game is found.    
	 * @return the winner of the Game
	 **/	
	WinnerStrategy createWinnerStrategy(StateMachine sm);

	/**
	 * Creates the rules by witch the rounds in the game are defined, this according to gamevariant.
	 * The strategy in some cases uses a DeckOfCardsStrategy  
	 * @param sm Statemachine  
	 * @return roundsequence rules
	 **/	
	RoundSequenceStrategy createRoundSequenceStrategy(StateMachine sm);

	/**
	 * Creates the rules by witch the units can be deployed after a move, buy   
	 * @return rules by witch units can be deployed
	 **/	
	PlaceUnitsStrategy createPlaceUnitsStrategy();

	/**
	 * Creates the rules by witch a battle is conducted   
	 * @return rules for the battle. 
	 **/	
	AttackStrategy createAttackStrategy();

	/**
	 * Creates the rules what state should come after a move, either another move or a buy   
	 * The rules for the gammavariant as an ex., dictates if a deck of is created on the 
	 * dicevalue 6. There must be 2 x moves before a buy can be conducted.   
	 * @return the state after a move. 
	 **/		
	MoveToBuyStrategy createMoveToBuyStrategy();


	/**
	 * Creates the action - if any - that should be performed after a die is rolled
	 * @param sm the statemachine
	 * @return the action that should be performed after a die has been rolled
	 */

	AfterDieRollActionStrategy createAfterDieRollActionStrategy(StateMachine sm);

	/**
	 * 
	 * @return the title of the game variant.
	 */
	String getWindowTitle();

}
